<?php

include model_chemin('putDateAAAAMMJJ');
/**
 * ActionDeCommunication
 */
class ActionDeCommunication extends CI_Model
{
	const TABLE_ADC						= 'action';
	const ID_ADC						= 'IDAction';
	const TITRE_ADC 					= 'TitreAction';
	const COMMENTAIRE_ADC 				= 'CommA';
	const DATE_ADC 						= 'DateA';
	const DATE_LIMITE_INSCRIPTION_ADC	= 'DateLimiteA';
	const NB_ETUDIANTS_MAX_ADC 			= 'NbEtuA';
	const NOTE_MAX_ADC 					= 'NoteMaxA';
	const LOGIN_ENSEIGNANT_ADC 			= 'LoginE';
	const THEME_ADC						= 'CodeTheme';
	const ETAT_ADC						= 'CodeEtat';
	const GROUPABLE_ADC					= 'GroupeForum';
	const ANNEE_SCOLAIRE_ADC			= 'AnneeScolaire';
	
	/**
	 * @var integer
	 */
	private $id;

	/**
	 * @var string
	 */
	private $titre;

	/**
	 * @var string
	 */
	private $commentaire;

	/**
	 * @var string
	 */
	private $date;

	/**
	 * @var string
	 */
	private $dateLimiteInscription;

	/**
	 * @var integer
	 */
	private $nombreEtudiantMax;

	/**
	 * @var float
	 */
	private $noteMax;
	
	/**
	 * @var string
	 */
	private $enseignant;
	
	/**
	 * @var integer
	 */
	private $theme;

	/**
	 * @var integer
	 */
	private $etat;

	/**
	 * @var boolean
	 */
	private $groupable;

	private $anneeScolaire;
	
	public function __construct()
	{
		parent::__construct();
		
		$this->load->model('Utilisateurs/Participe');
		$this->load->model('Utilisateurs/Enseignant');
		$this->load->model('ActionsDeCommunication/Theme');
	}
	
	public function count($where = array())
	{    	
		$date = new DateTime(); // date d'aujourd'hui
		$anneeScolaire = get_annee_scolaire($date->format('d/m/Y'));
		
		return (int) $this->db->where($where)
							  ->where(self::ANNEE_SCOLAIRE_ADC, $anneeScolaire)
							  ->count_all_results(ActionDeCommunication::TABLE_ADC);
	}

	/**
	 * Fonction permettant de récupérer les étudiants participant à une action de communication.
	 * @param integer $idAction Identifiant de l'action dont on souhaite avoir les élèves.
	 * @return array Un tableau d'étudiants.
	 */
	public static function findEtudiants($idAction)
	{    	 
		$CI = get_instance();
		$CI->load->database('db_adc', true);
		
		$ids_etudiants = $CI->db->select(Participe::ID_ETUDIANT_PARTICIPE)
								->from(Participe::TABLE_PARTICIPE)
								->where(Participe::ID_ACTION_PARTICIPE, $idAction)
								->get()
								->result_array();
		
		if(!empty($ids_etudiants))
		{
			$etudiants=array();
			foreach($ids_etudiants as $idEtudiant)
			{
				$etudiants[] = Etudiants::findById($idEtudiant[Participe::ID_ETUDIANT_PARTICIPE]);
			}
			return $etudiants;
		}
		else
			return null;
	}
	
	/**
	 * Fonction permettant de compter le nombre d'étudiants inscrits à une action de communication.
	 * @return int
	 */
	public function countEtudiants()
	{
		$CI = get_instance();
		$CI->load->database('db_adc', true);
		return (int) $CI->db->where(Participe::ID_ACTION_PARTICIPE, $this->getId())
							->count_all_results(Participe::TABLE_PARTICIPE);
	}
	
	/**
	 * Fonctions permettant de trouver toutes les actions de communication
	 * @return array Un tableau d'actions de communication.
	 */
	public static function findAll($where = null, $filtre = null, $anneeScolaire = null)
	{
		include_once model_chemin('get_annee_scolaire');
		$CI = get_instance();
		$CI->load->database('db_adc', true);
		
		if($filtre != null)
		{
			switch($filtre)
			{
				case 'theme':
					$filtre = self::THEME_ADC;
					break;
				case 'titre':
					$filtre = self::TITRE_ADC;
					break;
				case 'enseignant':
					$filtre = Enseignant::NOM_ENSEIGNANT;
					break;
				case 'date':
					$filtre = 'YEAR('.self::DATE_ADC.'), MONTH('.self::DATE_ADC.'), DAY('.self::DATE_ADC.')';
					break;
				case 'etat':
					$filtre = self::ETAT_ADC;
					break;
				default:
					$filtre = null;
			}	
		}    	
		
		if($anneeScolaire == null)
		{
			$date = new DateTime(); // date d'aujourd'hui
			$anneeScolaire = get_annee_scolaire($date->format('d/m/Y'));
		}
		
		$CI->db	->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.', a.'.self::LOGIN_ENSEIGNANT_ADC.', e.'.Enseignant::NOM_ENSEIGNANT.', '.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC.',a.'.self::ANNEE_SCOLAIRE_ADC)
				->from(self::TABLE_ADC.' a')
				->join(Enseignant::TABLE_ENSEIGNANT.' e', 'a.'.self::LOGIN_ENSEIGNANT_ADC.' = e.'.self::LOGIN_ENSEIGNANT_ADC, 'left')
				->where(self::ANNEE_SCOLAIRE_ADC, $anneeScolaire)
		;
		
		if($where != null)
			$CI->db->where($where);
		if($filtre != null)
			$CI->db->order_by($filtre, 'asc');
		
		$resultat = $CI->db->get()
						   ->result_array();
		
		$actions = array();
		
		if(!empty($resultat))
		{
			foreach($resultat as $r)
			{
				$action = new ActionDeCommunication();
				$action->setId($r[self::ID_ADC]);
				$action->setTitre($r[self::TITRE_ADC]);
				$action->setCommentaire($r[self::COMMENTAIRE_ADC]);
				$action->setDate($r[self::DATE_ADC]);
				$action->setEnseignant($r[self::LOGIN_ENSEIGNANT_ADC]);
				$action->setTheme($r[self::THEME_ADC]);
				$action->setEtat($r[self::ETAT_ADC]);
				$action->setGroupable($r[self::GROUPABLE_ADC]);
				$action->setAnneeScolaire($r[self::ANNEE_SCOLAIRE_ADC]);
		
				$actions[] = $action;
			}
		}
		
		return $actions;
	}
	
	public static function findByUser($utilisateur, $role, $filtre = null)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
		 
		$date = new DateTime(); // date d'aujourd'hui
		$anneeScolaire = get_annee_scolaire($date->format('d/m/Y'));
		
		if($filtre != null)
		{
			switch($filtre)
			{
				case 'theme':
					$filtre = self::THEME_ADC;
					break;
				case 'titre':
					$filtre = self::TITRE_ADC;
					break;
				case 'enseignant':
					$filtre = Enseignant::NOM_ENSEIGNANT;
					break;
				case 'date':
					$filtre = 'YEAR('.self::DATE_ADC.'), MONTH('.self::DATE_ADC.'), DAY('.self::DATE_ADC.')';
					break;
				case 'etat':
					$filtre = self::ETAT_ADC;
					break;
				default:
					$filtre = null;
			}	
		}  
		
		if ($role == 'etudiant')
		{
			$CI->db->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.', a.'.self::LOGIN_ENSEIGNANT_ADC.', e.'.Enseignant::NOM_ENSEIGNANT.', '.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC.','.self::NOTE_MAX_ADC)
				   ->from(self::TABLE_ADC.' a')
				   ->join(Enseignant::TABLE_ENSEIGNANT.' e', 'a.'.self::LOGIN_ENSEIGNANT_ADC.' = e.'.self::LOGIN_ENSEIGNANT_ADC, 'left')
				   ->where(self::ID_ADC.' IN (SELECT '.Participe::ID_ACTION_PARTICIPE.'
											  FROM '.Participe::TABLE_PARTICIPE.'
											  WHERE '.Participe::ID_ETUDIANT_PARTICIPE.' = '.$utilisateur.')
						AND '.self::GROUPABLE_ADC.' = 0
				   		AND '.self::ANNEE_SCOLAIRE_ADC.' = "'.$anneeScolaire.'"');
		}
		else 
		{
			$CI->db	->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.', a.'.self::LOGIN_ENSEIGNANT_ADC.', e.'.Enseignant::NOM_ENSEIGNANT.', '.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC)
					->join(Enseignant::TABLE_ENSEIGNANT.' e', 'a.'.self::LOGIN_ENSEIGNANT_ADC.' = e.'.self::LOGIN_ENSEIGNANT_ADC, 'left')
					->from(self::TABLE_ADC.' a')
					->where('e.'.self::LOGIN_ENSEIGNANT_ADC.' = "'.$utilisateur.'" 
						AND a.'.self::GROUPABLE_ADC.' = 0
						AND '.self::ANNEE_SCOLAIRE_ADC.' = "'.$anneeScolaire.'"');
		}
		
		if($filtre != null)
			$CI->db->order_by($filtre, 'asc');
		$resultat = $CI->db->get()
					   ->result_array();
		
		$actions = array();
		
		if(!empty($resultat))
		{
			foreach($resultat as $r)
			{
				$action = new ActionDeCommunication();
				$action->setId($r[ActionDeCommunication::ID_ADC]);
				$action->setTitre($r[ActionDeCommunication::TITRE_ADC]);
				$action->setCommentaire($r[ActionDeCommunication::COMMENTAIRE_ADC]);
				$action->setDate($r[ActionDeCommunication::DATE_ADC]);
				$action->setEnseignant($r[ActionDeCommunication::LOGIN_ENSEIGNANT_ADC]);
				$action->setTheme($r[ActionDeCommunication::THEME_ADC]);
				$action->setEtat($r[ActionDeCommunication::ETAT_ADC]);
				if($role == 'etudiant')
					$action->setNoteMax($r[ActionDeCommunication::NOTE_MAX_ADC]);
				$action->setGroupable($r[ActionDeCommunication::GROUPABLE_ADC]);
				 
				$actions[] = $action;
			}
		}
		
		 
		return $actions;
	}
	
	/**
	 * Fonctions permettant de trouver toutes les actions de communication
	 * @return array Un tableau d'actions de communication.
	 */
	public static function findAllDate($date)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
			
		if($date == date('Y-m-d'))
			$resultat = $CI->db	->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.','.self::LOGIN_ENSEIGNANT_ADC.','.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC)
								->from(self::TABLE_ADC)
								->where(self::DATE_ADC.' <= ADDDATE(NOW(),30)
										AND '.self::ETAT_ADC.' <> 4
										AND '.self::ETAT_ADC.' <> 5
										AND '.self::ETAT_ADC.' <> 6')
								->order_by('YEAR('.self::DATE_ADC.'), MONTH('.self::DATE_ADC.'), DAY('.self::DATE_ADC.')', 'asc')
								->get()
								->result_array();
		else 
			$resultat = $CI->db	->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.','.self::LOGIN_ENSEIGNANT_ADC.','.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC)
								->from(self::TABLE_ADC)
								->where(self::DATE_ADC.' <= "'.$date.'"
										AND '.self::ETAT_ADC.' <> 4
										AND '.self::ETAT_ADC.' <> 5
										AND '.self::ETAT_ADC.' <> 6')
								->order_by('YEAR('.self::DATE_ADC.'), MONTH('.self::DATE_ADC.'), DAY('.self::DATE_ADC.')', 'asc')
								->get()
								->result_array();    		
		 
		$actions = array();
		 
		if(!empty($resultat))
		{
			foreach($resultat as $r)
			{
				$action = new ActionDeCommunication();
				$action->setId($r[ActionDeCommunication::ID_ADC]);
				$action->setTitre($r[ActionDeCommunication::TITRE_ADC]);
				$action->setCommentaire($r[ActionDeCommunication::COMMENTAIRE_ADC]);
				$action->setDate($r[ActionDeCommunication::DATE_ADC]);
				$action->setEnseignant($r[ActionDeCommunication::LOGIN_ENSEIGNANT_ADC]);
				$action->setTheme($r[ActionDeCommunication::THEME_ADC]);
				$action->setEtat($r[ActionDeCommunication::ETAT_ADC]);
				$action->setGroupable($r[ActionDeCommunication::GROUPABLE_ADC]);
				 
				$actions[] = $action;
			}
		}
		 
		return $actions;
	}
	
	/**
	 * Fonction permettant de récupérer une action de communication en fonction de son identifiant
	 * @param integer $id identifiant de l'action
	 * @return ActionDeCommunication une action de communication
	 */
	public static function findById($id)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$resultat = $CI->db	->select(self::ID_ADC.','.self::TITRE_ADC.','.self::COMMENTAIRE_ADC.','.self::DATE_ADC.','.self::DATE_LIMITE_INSCRIPTION_ADC.','.self::NB_ETUDIANTS_MAX_ADC.','.self::NOTE_MAX_ADC.','.self::LOGIN_ENSEIGNANT_ADC.','.self::THEME_ADC.','.self::ETAT_ADC.','.self::GROUPABLE_ADC.','.self::ANNEE_SCOLAIRE_ADC)
							->from(self::TABLE_ADC)
							->where(self::ID_ADC, $id)
							->limit(1)
							->get()
							->result_array();
		
		if(!empty($resultat))
		{
			$action = new ActionDeCommunication();
			$action->setId($resultat[0][self::ID_ADC]);
			$action->setTitre($resultat[0][self::TITRE_ADC]);
			$action->setCommentaire($resultat[0][self::COMMENTAIRE_ADC]);
			$action->setDate($resultat[0][self::DATE_ADC]);
			$action->setDateLimiteInscription($resultat[0][self::DATE_LIMITE_INSCRIPTION_ADC]);
			$action->setNombreEtudiantMax($resultat[0][self::NB_ETUDIANTS_MAX_ADC]);
			$action->setNoteMax($resultat[0][self::NOTE_MAX_ADC]);
			$action->setEnseignant($resultat[0][self::LOGIN_ENSEIGNANT_ADC]);
			$action->setTheme($resultat[0][self::THEME_ADC]);
			$action->setEtat($resultat[0][self::ETAT_ADC]);
			$action->setGroupable($resultat[0][self::GROUPABLE_ADC]);
			$action->setAnneeScolaire($resultat[0][self::ANNEE_SCOLAIRE_ADC]);
			return $action;
		}
		return false;
	}
	
	/**
	 * Fonctions permettant de retourner la bonne condition WHERE
	 * @param String $where where voulu
	 * @return la condition WHERE
	 */
	public static function findWhere($where)
	{
		$whr = '';
		switch($where)
		{
			case 'ALL' : 
				$whr = self::ETAT_ADC.' <> 6';
				break;
			case 'WHERE_ALL':
				$whr = self::GROUPABLE_ADC.' = 0 
					   AND '.self::ETAT_ADC.' <> 6';
				break;
			case 'WHERE_INC':
				$whr = self::GROUPABLE_ADC.' = 0
					   AND '.self::ETAT_ADC.' = 1
					   AND '.self::TITRE_ADC.' <> "'.Forum::LUNDI.'"
					   AND '.self::TITRE_ADC.' <> "'.Forum::LUNDI2.'"
					   AND ('.self::DATE_ADC.' IS NULL
					   OR '.self::NOTE_MAX_ADC.' IS NULL
					   OR e.'.self::LOGIN_ENSEIGNANT_ADC.' IS NULL)';
				break;
			case 'WHERE_INC_COUNT':
				$whr = self::GROUPABLE_ADC.' = 0
					   AND '.self::ETAT_ADC.' = 1
					   AND '.self::TITRE_ADC.' <> "'.Forum::LUNDI.'"
					   AND '.self::TITRE_ADC.' <> "'.Forum::LUNDI2.'"
					   AND ('.self::DATE_ADC.' IS NULL
					   OR '.self::NOTE_MAX_ADC.' IS NULL
					   OR '.self::LOGIN_ENSEIGNANT_ADC.' IS NULL)';
				break;
			case 'WHERE_OUV':
				$whr = self::GROUPABLE_ADC.' = 0
						AND '.self::ETAT_ADC.' = 1';
				break;
			case 'WHERE_COM':
				$whr = self::GROUPABLE_ADC.' = 0
						AND '.self::ETAT_ADC.' = 2';
				break;
			case 'WHERE_CLO':
				$whr = self::GROUPABLE_ADC.' = 0
						AND '.self::ETAT_ADC.' = 3';
				break;
			case 'WHERE_TER':
				$whr = self::GROUPABLE_ADC.' = 0
						AND '.self::ETAT_ADC.' = 5';
				break;
			case 'WHERE_NOT':
				$whr = self::GROUPABLE_ADC.' = 0
						AND '.self::ETAT_ADC.' = 4';
				break;
			case 'WHERE_PRO':
				$whr = self::GROUPABLE_ADC.' = 0
					AND '.self::ETAT_ADC.' = 6';
				break;
			default:
				exit("erreur");    		
		}    
			 
		return $whr;
	}
	
	/**
	 * Permet de savoir si l'étudiant est inscrit à la liste d'attente de l'action de communication
	 * @param int $idEtu identifiant de l'etudiant
	 * @return boolean true si l'étudiant est dans la liste d'attente sinon false
	 */
	public function is_attenteADC($idEtu)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
		
		$ok = $CI->db 	->where(array(AttenteAction::ID_ACTION_ATTENTE => $this->getId(),
							AttenteAction::ID_ETUDIANT_ATTENTE => $idEtu))
						->count_all_results(AttenteAction::TABLE_ATTENTE_ADC);
		if( $ok > 0)
			return true;
		else
			return false;
	}
	
	/**
	 * Permet d'inscrire un étudiant à l'action de communication
	 * @param int $idEtu identifiant de l'etudiant
	 */
	public function inscrireADC($idEtu)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
		
		$CI->db->set(Participe::ID_ACTION_PARTICIPE, $this->getId());
		$CI->db->set(Participe::ID_ETUDIANT_PARTICIPE, $idEtu);
		
		$CI->db->insert(Participe::TABLE_PARTICIPE);
		
		if($this->getNombreEtudiantMax()==$this->countEtudiants())
		{
			$CI->db->set(self::ETAT_ADC, 2);
			
			$CI->db->where(self::ID_ADC, (int)$this->getId());
			
			$CI->db->update(self::TABLE_ADC);
		}
	}
	
	/**
	 * Permet de désinscrire un étudiant de l'action de communication
	 * @param int $idEtu identifiant de l'etudiant
	 */
	public function desinscrireADC($idEtu)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$CI->db->where(array(Participe::ID_ACTION_PARTICIPE => $this->getId(),
						Participe::ID_ETUDIANT_PARTICIPE => $idEtu))
		->delete(Participe::TABLE_PARTICIPE);

		$attente = (int) $CI->db->where(AttenteAction::ID_ACTION_ATTENTE, $this->getId())
						->count_all_results(AttenteAction::TABLE_ATTENTE_ADC);
		if( $attente > 0)
		{
			$etu = $CI->db	->select(AttenteAction::ID_ETUDIANT_ATTENTE)
							->from(AttenteAction::TABLE_ATTENTE_ADC)
							->where(array(AttenteAction::ID_ACTION_ATTENTE => $this->getId(),
									AttenteAction::RANG_ATTENTE => 1))
							->get()
							->result_array(); 
			$this->inscrireADC($etu[0][AttenteAction::ID_ETUDIANT_ATTENTE]);
			$this->desinscrireAttenteADC($etu[0][AttenteAction::ID_ETUDIANT_ATTENTE]);
			//$etudiant->envoyerMail("Inscription automatique à : ".$this->getTitre(),"Bonjour,<br>Vous avez été inscrit automatiquement à l'action ".$this->getTitre()."<br>Cordialement");
		}
		else
		{
			$CI->db->set(self::ETAT_ADC, 1);
			
			$CI->db->where(self::ID_ADC, (int)$this->getId());
			
			$CI->db->update(self::TABLE_ADC);
		}
	}
	
	/**
	 * Permet d'inscrire un étudiant en liste d'attente de l'action de communication 
	 * @param int $idEtu identifiant de l'etudiant
	 */
	public function inscrireAttenteADC($idEtu)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$rang = $CI->db	->select_max(AttenteAction::RANG_ATTENTE)
						->from(AttenteAction::TABLE_ATTENTE_ADC)
						->where(AttenteAction::ID_ACTION_ATTENTE, $this->getId())
						->get()
						->result_array();
		if(is_null($rang[0][AttenteAction::RANG_ATTENTE]))
			$r = 1;
		else
			$r = $rang[0][AttenteAction::RANG_ATTENTE] + 1;
	
		$CI->db->set(AttenteAction::ID_ACTION_ATTENTE, $this->getId());
		$CI->db->set(AttenteAction::ID_ETUDIANT_ATTENTE, $idEtu);
		$CI->db->set(AttenteAction::RANG_ATTENTE, $r);
		
		$CI->db->insert(AttenteAction::TABLE_ATTENTE_ADC);
	}
	
	/**
	 * Permet de récupérer le rang d'un étudiant en liste d'attente d'une adc
	 * @param int $idEtu identifiant de l'etudiant
	 * @return int
	 */
	public function rangAttenteADC($idEtu)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$rang = $CI->db	->select(AttenteAction::RANG_ATTENTE)
						->from(AttenteAction::TABLE_ATTENTE_ADC)
						->where(array(AttenteAction::ID_ACTION_ATTENTE => $this->getId(),
									AttenteAction::ID_ETUDIANT_ATTENTE => $idEtu))
						->get()
						->result_array();
	
		return $rang[0][AttenteAction::RANG_ATTENTE];
	}
	
	/**
	 * Permet de désinscrire un étudiant de la liste d'attente de l'action de communication
	 * @param int $idEtu identifiant de l'etudiant
	 */
	public function desinscrireAttenteADC($idEtu)
	{
		$CI = get_instance();
		
		$CI->load->database('db_adc', true);
		
		$rang = $this->rangAttenteADC($idEtu);
	
		$CI->db->where(array(AttenteAction::ID_ACTION_ATTENTE => $this->getId(),
							AttenteAction::ID_ETUDIANT_ATTENTE => $idEtu))
				->delete(AttenteAction::TABLE_ATTENTE_ADC);
		
		$CI->db->set(AttenteAction::RANG_ATTENTE, AttenteAction::RANG_ATTENTE.' -1', FALSE);
		$CI->db->where(AttenteAction::ID_ACTION_ATTENTE.' = '.(int)$this->getId().'
							AND '.AttenteAction::RANG_ATTENTE.' > '.$rang);	
		$CI->db->update(AttenteAction::TABLE_ATTENTE_ADC);
	}
	
	/**
	 * Permet d'ajouter un professeur à l'action
	 * @param string $loginProf
	 */
	public function inscrireEnseignantADC($loginProf)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
	
		$CI->db->set(self::LOGIN_ENSEIGNANT_ADC, $loginProf)
		->where(self::ID_ADC, (int)$this->getId())
		->update(self::TABLE_ADC);
	}
	
	/**
	 * Fonction permettant d'ajouter une action
	 * @param string $titre titre de l'action
	 * @param string $commentaire commentaire de l'action
	 * @param date $date date de l'action
	 * @param date $dateLimite date limite d'inscription à l'action
	 * @param int $nbEtudiant nombre d'étudiant maximum de l'action
	 * @param float $noteMax note maximale de l'action
	 * @param int $loginEnseignant login de l'enseignant chargé de l'action
	 * @param int $idTheme id du thème de l'action
	 * @param int $idEtat id de l'etat de l'action
	 * @param int $groupable caractère groupable de l'action
	 * @return true ou false
	 */
	public static function addADC($titre, $commentaire, $date, $dateLimite, $nbEtudiant, $noteMax, $loginEnseignant, $idTheme, $idEtat, $groupable)
	{
		include_once model_chemin('get_annee_scolaire');
		$datetime = new DateTime(); // date d'aujourd'hui
		$anneeScolaire = get_annee_scolaire($datetime->format('d/m/Y'));

		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
		
		if($commentaire != null)
			$CI->db->set(self::COMMENTAIRE_ADC, $commentaire);
		
		if($date != null)
		{
			$CI->db->set(self::DATE_ADC, putDateAAAAMMJJ($date));
			$anneeScolaire = get_annee_scolaire($date);
		}
		
		if($dateLimite != null)
			$CI->db->set(self::DATE_LIMITE_INSCRIPTION_ADC, putDateAAAAMMJJ($dateLimite));
		 
		if($nbEtudiant != null)
			$CI->db->set(self::NB_ETUDIANTS_MAX_ADC, $nbEtudiant);
		
		if($noteMax != null)
			$CI->db->set(self::NOTE_MAX_ADC, $noteMax);
		
		if($loginEnseignant != null)
			$CI->db->set(self::LOGIN_ENSEIGNANT_ADC, $loginEnseignant);
		
		$CI->db->set(self::TITRE_ADC, $titre);
		$CI->db->set(self::THEME_ADC, $idTheme);
		$CI->db->set(self::ETAT_ADC, $idEtat);
		$CI->db->set(self::GROUPABLE_ADC, $groupable);
		$CI->db->set(self::ANNEE_SCOLAIRE_ADC, $anneeScolaire);
		 
		return $CI->db->insert(self::TABLE_ADC);
	}
	
	/**
	 * Fonction permettant de modifier une action
	 * @param string $titre titre de l'action
	 * @param string $commentaire commentaire de l'action
	 * @param date $date date de l'action
	 * @param date $dateLimite date limite d'inscription à l'action
	 * @param int $nbEtudiant nombre d'étudiant maximum de l'action
	 * @param float $noteMax note maximale de l'action
	 * @param int $loginEnseignant login de l'enseignant chargé de l'action
	 * @param int $idTheme id du thème de l'action
	 * @param int $idEtat id de l'etat de l'action
	 * @return true ou false
	 */
	public function modifyADC($titre, $commentaire, $date, $dateLimite, $nbEtudiant, $noteMax, $loginEnseignant, $idTheme, $idEtat)
	{
		$CI = get_instance();
		 
		$CI->load->database('db_adc', true);
	
		if($commentaire != null)
			$CI->db->set(self::COMMENTAIRE_ADC, $commentaire);
		else
			$CI->db->set(self::COMMENTAIRE_ADC, null);
		
		if($date != null)
		{
			include model_chemin('get_annee_scolaire');
			$CI->db->set(self::DATE_ADC, putDateAAAAMMJJ($date));
			$anneeScolaire = get_annee_scolaire($date);
			$CI->db->set(self::ANNEE_SCOLAIRE_ADC, $anneeScolaire);
		}
		else
			$CI->db->set(self::DATE_ADC, null);
		
		if($dateLimite != null)
			$CI->db->set(self::DATE_LIMITE_INSCRIPTION_ADC, putDateAAAAMMJJ($dateLimite));
		else
			$CI->db->set(self::DATE_LIMITE_INSCRIPTION_ADC, null);
		
		if($noteMax != null)
			$CI->db->set(self::NOTE_MAX_ADC, $noteMax);
		else
			$CI->db->set(self::NOTE_MAX_ADC, null);
		
		if($loginEnseignant != null)
			$CI->db->set(self::LOGIN_ENSEIGNANT_ADC, $loginEnseignant);
		else
			$CI->db->set(self::LOGIN_ENSEIGNANT_ADC, null);
		
		if($idEtat == 6)
			$CI->db->set(self::ETAT_ADC, 1);
		else 
			$CI->db->set(self::ETAT_ADC, $idEtat);
		
		$CI->db->set(self::TITRE_ADC, $titre);
		$CI->db->set(self::THEME_ADC, $idTheme);
		$CI->db->set(self::NB_ETUDIANTS_MAX_ADC, $nbEtudiant);
		 
		$CI->db->where(self::ID_ADC, (int)$this->getId());
	
		return $CI->db->update(self::TABLE_ADC);
	}
	
	/**
	 * Fonction permettant de modifier l'etat d'une adc
	 * @param int $idEtat id de l'etat de l'action
	 * @return true ou false
	 */
	public function modifyEtatADC($idEtat)
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
	
		$CI->db->set(self::ETAT_ADC, $idEtat);
	
		$CI->db->where(self::ID_ADC, (int)$this->getId());
	
		return $CI->db->update(self::TABLE_ADC);
	}
	
	/**
	 * Fonction permettant de supprimer une action
	 * @return true ou false
	 */
	public function delADC()
	{
		$CI = get_instance();
	
		$CI->load->database('db_adc', true);
		
		if($this->getGroupable()==true || $this->getTitre()==Forum::LUNDI || $this->getTitre()==Forum::LUNDI2)
		{
			$CI->db->where(Forum::ID_ADC_FORUM, (int)$this->getId())
			->delete(Forum::TABLE_FORUM);
		}
		
		if($this->getGroupable()==false || $this->getTitre()==Forum::LUNDI || $this->getTitre()==Forum::LUNDI2)
		{
			$CI->db->where(Participe::ID_ACTION_PARTICIPE, (int)$this->getId())
					->delete(Participe::TABLE_PARTICIPE);
		}
		 
		return $CI->db->where(self::ID_ADC, (int)$this->getId())
		->delete(self::TABLE_ADC);
	}
	
	/**
	 * Permet de vérifier le formulaire de création d'une action
	 * @param String $titre titre de l'action
	 * @param Date $date date de l'action
	 * @param Date $dateLimite date limite de l'action
	 * @param int $nbEtu nombre d'étudiant de l'action
	 * @param double $ptMax point max attribué aux etudiants de l'action
	 * @param String $theme theme de l'action
	 * @param int $lie action groupable ou non
	 * @return boolean
	 */
	public static function check($titre, $date, $dateLimite, $nbEtu, $ptMax, $enseignant, $theme, $lie)
	{
		$CI =& get_instance();
		$message = '';
		$retour = true;
		if($lie == 0)
		{
			if($date != null)
			{
				if(!verif($date, 'date'))
				{
					$message .= "<br>Format de la date de déroulement incorrecte, elle doit être de la forme jj/mm/aaaa.";
					$retour = false;
				}
			}
				
			if($dateLimite != null)
			{
				if(!verif($dateLimite, 'date'))
				{
					$message .= "<br>Format de la date limite incorrecte, elle doit être de la forme jj/mm/aaaa.";
					$retour = false;
				}
			}
			if($titre == null || $nbEtu == null || !is_numeric($nbEtu))
			{
				$message .= "<br>Vous devez remplir tout les champs obligatoires.";
				$CI->session->set_flashdata('message', $message);
				return false;
			}
			else
			{
				if($date != null && verif($date, 'date'))
				{
					if(isLater(date("d/m/Y"), $date) != 1)
					{
						$message .= "<br>La date de déroulement doit être supérieur à celle du jour.";
						$retour = false;
					}
		
					if($dateLimite != null && verif($dateLimite, 'date'))
					{
						if(isLater(date("d/m/Y"), $dateLimite) != 1)
						{
							$message .= "<br>La date limite entrée doit être supérieur à celle du jour.";
							$retour = false;
						}
						if(isLater($dateLimite, $date) != 1)
						{
							$message .= "<br>La date limite entrée doit être antérieure à la date de déroulement.";
							$retour = false;
						}
					}	
				}
				if($dateLimite != null && $date == null)
				{
					$message .= "<br>Vous devez entrez une date de déroulement pour indiquer une date limite.";
					$retour = false;
				}
				if($nbEtu <= 0)
				{
					$message .= "<br>Le nombre d'étudiant maximum doit être supérieur à 0.";
					$retour = false;
				}
				if($nbEtu > Parametre::findByLibelle('Nombre étudiants maximum'))
				{
					$message .= "<br>Le nombre d'étudiant maximum doit être inférieur ou égale à ".Parametre::findByLibelle('Nombre étudiants maximum');
					$retour = false;
				}
				if($ptMax != null && $ptMax < 0)
				{
					$message .= "<br>La note maximum doit être supérieur à 0.";
					$retour = false;
				}
				if($ptMax > Parametre::findByLibelle('Nombre points maximum'))
				{
					$message .= "<br>Le nombre de point maximum doit être inférieur ou égale à ".Parametre::findByLibelle('Nombre points maximum');
					$retour = false;
				}
				if($enseignant != null)
				{
					$enseignants = Enseignant::findAll();
					$enseignantOk = false;
					foreach($enseignants as $ens)
					{
						if($ens->getLogin() == $enseignant)
							$enseignantOk = true;
					}
					if(!$enseignantOk)
					{
						$message .= "<br>Login de l'enseignant incorrect.";
						$retour = false;
					}
				}
				if($theme != null)
				{
					$themes = Theme::findAll();
					$themeOk = false;
					foreach($themes as $t)
					{
						if($t->getId() == $theme)
							$themeOk = true;
					}
					if(!$themeOk)
					{
						$message .= "<br>Theme incorrect.";
						$retour = false;
					}
				}
				$CI->session->set_flashdata('message', $message);
				return $retour;
			}
		}
		elseif($lie == 1)
		{
			if($titre == null)
			{
				$message .= "<br>Vous devez indiquer un titre.";
				$CI->session->set_flashdata('message', $message);
				return false;
			}
			else
				return true;
		}
	}
	
	/**
	 * Permet de vérifier le formulaire de proposition d'une action
	 * @param String $titre titre de l'action
	 * @param String $theme theme de l'action
	 * @param Date $date date de l'action
	 * @param int $nbEtu nombre d'étudiant de l'action
	 * @return boolean
	 */
	public static function checkProposition($titre, $theme, $date, $nbEtu, $com)
	{
		$CI =& get_instance();
		$message = '';
		$retour = true;
		if($date != null)
		{
			if(!verif($date, 'date'))
			{
				$message .= "<br>Format de la date de déroulement incorrecte, elle doit être de la forme jj/mm/aaaa.";
				$retour = false;
			}
		}
		 
		if($titre == null || $titre == ' ')
		{
			$message .= "<br>Le champ titre est obligatoire.";
			$CI->session->set_flashdata('message', $message);
			return false;
		}
		if($com == null || $com == ' ')
		{
			$message .= "<br>Le champ commentaire est obligatoire.";
			$CI->session->set_flashdata('message', $message);
			return false;
		}
		else
		{
			if($date != null && verif($date, 'date'))
			{
				if(isLater(date("d/m/Y"), $date) != 1)
				{
					$message .= "<br>La date de déroulement doit être supérieur à celle du jour.";
					$retour = false;
				}
			}
			if($nbEtu != null)
			{
				if($nbEtu <= 0)
				{
					$message .= "<br>Le nombre d'étudiant maximum doit être supérieur à 0.";
					$retour = false;
				}
				if($nbEtu > Parametre::findByLibelle('Nombre étudiants maximum'))
				{
					$message .= "<br>Le nombre d'étudiant maximum doit être inférieur ou égale à ".Parametre::findByLibelle('Nombre étudiants maximum');
					$retour = false;
				}
			}
			if($theme != null)
			{
				$themes = Theme::findAll();
				$themeOk = false;
				foreach($themes as $t)
				{
					if($t->getId() == $theme)
						$themeOk = true;
				}
				if(!$themeOk)
				{
					$message .= "<br>Les champ theme est incorrect.";
					$retour = false;
				}
			}
			$CI->session->set_flashdata('message', $message);
			return $retour;
		}
	}
	
	public static function lastId()
	{
		$CI = get_instance();
		$result = $CI->db	->select_max(self::ID_ADC)
							->from(self::TABLE_ADC)
							->get()
							->result_array();
		if(is_null($result[0][self::ID_ADC]))
			return false;
		else
			return $result[0][self::ID_ADC];
	} 

	public static function getAnneesScolaire()
	{
		$CI = get_instance();
		$CI->load->database('db_adc', true);

		$CI->db	->select(self::ANNEE_SCOLAIRE_ADC)
				->distinct()
				->from(self::TABLE_ADC)
		;
		
		$resultat = $CI->db	->get()
							->result_array()
		;
		
		$annees = array();
		
		foreach($resultat as $r)
		{
			$annees[] = $r[self::ANNEE_SCOLAIRE_ADC]; 
		}
		
		return $annees;
		
	}
	
	/**
	 * Get id
	 *
	 * @return integer 
	 */
	public function getId()
	{
		return $this->id;
	}
	
	/**
	 * Set id
	 *
	 * @param integer $id
	 * @return integer 
	 */
	public function setId($id)
	{
		$this->id = $id;
	}

	/**
	 * Set titre
	 *
	 * @param string $titre
	 * @return ActionDeCommunication
	 */
	public function setTitre($titre)
	{
		$this->titre = $titre;
	}

	/**
	 * Get titre
	 *
	 * @return string 
	 */
	public function getTitre()
	{
		return $this->titre;
	}

	/**
	 * Set commentaire
	 *
	 * @param string $commentaire
	 * @return ActionDeCommunication
	 */
	public function setCommentaire($commentaire)
	{
		$this->commentaire = $commentaire;
	}

	/**
	 * Get commentaire
	 *
	 * @return string 
	 */
	public function getCommentaire()
	{
		return $this->commentaire;
	}

	/**
	 * Set date
	 *
	 * @param string $date
	 * @return ActionDeCommunication
	 */
	public function setDate($date)
	{
		$this->date = $date;
	}

	/**
	 * Get date
	 *
	 * @return string 
	 */
	public function getDate()
	{
		return $this->date;
	}

	/**
	 * Set dateLimiteInscription
	 *
	 * @param string $dateLimiteInscription
	 * @return ActionDeCommunication
	 */
	public function setDateLimiteInscription($dateLimiteInscription)
	{
		$this->dateLimiteInscription = $dateLimiteInscription;
	}

	/**
	 * Get dateLimiteInscription
	 *
	 * @return string 
	 */
	public function getDateLimiteInscription()
	{
		return $this->dateLimiteInscription;
	}
	
	

	/**
	 * Set nombreEtudiantMax
	 *
	 * @param integer $nombreEtudiantMax
	 * @return ActionDeCommunication
	 */
	public function setNombreEtudiantMax($nombreEtudiantMax)
	{
		$this->nombreEtudiantMax = $nombreEtudiantMax;
	}

	/**
	 * Get nombreEtudiantMax
	 *
	 * @return integer 
	 */
	public function getNombreEtudiantMax()
	{
		return $this->nombreEtudiantMax;
	}

	public function getNombreEtudiant()
	{
		$this->load->database('db_adc', true);
		$resultat = $this->db	->select('a.'.ActionDeCommunication::NB_ETUDIANTS_MAX_ADC.' - COUNT(*) as nbRestant')
								->from(ActionDeCommunication::TABLE_ADC.' a')
								->join(Participe::TABLE_PARTICIPE.' p', 'a.'.ActionDeCommunication::ID_ADC.' = p.'.Participe::ID_ACTION_PARTICIPE)
								->where('a.'.ActionDeCommunication::ID_ADC.' = '.$this->id)
								->limit(1)
								->get()
								->result_array();
		
		return $resultat[0]['nbRestant'];
	}
	
	/**
	 * Set groupable
	 *
	 * @param boolean $groupable
	 * @return ActionDeCommunication
	 */
	public function setGroupable($groupable)
	{
		$this->groupable = $groupable;
	}

	/**
	 * Get groupable
	 *
	 * @return boolean 
	 */
	public function getGroupable()
	{
		return $this->groupable;
	}

	/**
	 * Set theme
	 *
	 * @param integer $id ID du theme
	 * @return ActionDeCommunication
	 */
	public function setTheme($id = null)
	{
		$this->theme = $id;
	}

	/**
	 * Get theme
	 *
	 * @return Theme 
	 */
	public function getTheme()
	{
		$this->load->database('db_adc', true);
		$resultat = $this->db	->select('t.'.Theme::ID_THEME.', t.'.Theme::LIBELLE_THEME)
								->from(Theme::TABLE_THEME. ' t')
								->where('t.'.Theme::ID_THEME, $this->theme)
								->limit(1)
								->get()
								->result_array();
		
		if(!empty($resultat))
		{
			$theme = new Theme();
			$theme->setId($resultat[0][Theme::ID_THEME]);
			$theme->setLibelle($resultat[0][Theme::LIBELLE_THEME]);
			 
			return $theme;
		}
		return '';
	}

	/**
	 * Set etat
	 *
	 * @param integer $id ID de l'etat
	 * @return ActionDeCommunication
	 */
	public function setEtat($id = null)
	{
		$this->etat = $id;
	}

	/**
	 * Get etat
	 *
	 * @return Etat 
	 */
	public function getEtat()
	{
		$this->load->database('db_adc', true);
		$resultat = $this->db	->select(Etat::LIBELLE_ETAT.', '.Etat::ID_ETAT)
								->from(Etat::TABLE_ETAT)
								->where(Etat::ID_ETAT, $this->etat)
								->limit(1)
								->get()
								->result_array();
		if(!empty($resultat))
		{
			$etat = new Etat();
			$etat->setId($resultat[0][Etat::ID_ETAT]);
			$etat->setLibelle($resultat[0][Etat::LIBELLE_ETAT]);
			
			return $etat;
		}
		return '';
	}

	/**
	 * Set enseignant
	 *
	 * @param String $login Le login de l'enseignant
	 * @return ActionDeCommunication
	 */
	public function setEnseignant($enseignant = null)
	{
		$this->enseignant = $enseignant;
	}

	/**
	 * Get enseignant
	 *
	 * @return Enseignant 
	 */
	public function getEnseignant()
	{
		if($this->enseignant != null)
		{
			$this->load->database('db_adc', true);
			$resultat = $this->db	->select(Enseignant::LOGIN_ENSEIGNANT.', '.Enseignant::NOM_ENSEIGNANT.', '.Enseignant::PRENOM_ENSEIGNANT.', '.Enseignant::MAIL_ENSEIGNANT)
									->from(Enseignant::TABLE_ENSEIGNANT)
									->where(Enseignant::LOGIN_ENSEIGNANT, $this->enseignant)
									->limit(1)
									->get()
									->result_array();
			
			if(!empty($resultat))
			{
				$enseignant = new Enseignant();
				$enseignant->setLogin($resultat[0][Enseignant::LOGIN_ENSEIGNANT]);
				$enseignant->setNom($resultat[0][Enseignant::NOM_ENSEIGNANT]);
				$enseignant->setPrenom($resultat[0][Enseignant::PRENOM_ENSEIGNANT]);
				$enseignant->setMail($resultat[0][Enseignant::MAIL_ENSEIGNANT]);
				
				return $enseignant;
			}
			
			return '';
		}
		else
			return null;
	}

	/**
	 * Set noteMax
	 *
	 * @param integer $noteMax
	 * @return ActionDeCommunication
	 */
	public function setNoteMax($noteMax)
	{
		$this->noteMax = $noteMax;
	}

	/**
	 * Get noteMax
	 *
	 * @return integer 
	 */
	public function getNoteMax()
	{
		return $this->noteMax;
	}
	
	public function setAnneeScolaire($a)
	{
		$this->anneeScolaire = $a;
	}
	
	public function getAnneeScolaire()
	{
		return $this->anneeScolaire;
	}

	public function getCode()
	{
		$this->load->database('db_adc', true);
		$numero = $this->db	->query('
									SELECT COUNT( * )
									FROM '.self::TABLE_ADC.'
									WHERE '.self::THEME_ADC.' = '.$this->getTheme()->getId().'
									AND '.self::ID_ADC.' <= '.$this->getId().'
									ORDER BY '.self::ID_ADC.' ASC
				')
				
		;

		$numero->row_array();
		
		switch($this->getTheme()->getLibelle())
		{
			case 'FORUM':
				return 'A'.$numero->result_array[0]['COUNT( * )'];
				break;
			case 'DPT INFO':
				return 'B'.$numero->result_array[0]['COUNT( * )'];
				break;
			case 'BDE ODIN':
				return 'C'.$numero->result_array[0]['COUNT( * )'];
				break;
			default:
				return 'D'.$numero->result_array[0]['COUNT( * )'];
				break;
		}
	}
}
